package model

import (
	"fmt"
	"os"
	"strings"
	"time"

	"gitee.com/colzry/gin-postgres/utils"
	log "github.com/sirupsen/logrus"
	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

var (
	db *gorm.DB
	dialector gorm.Dialector
	err error
)

func InitDb() {
	switch strings.ToLower(utils.Type) {
	case "mysql":
		dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
		utils.Username,
		utils.Password,
		utils.Host,
		utils.Port,
		utils.DBName)
		dialector = mysql.Open(dns)
	case "postgres":
		dns := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Shanghai",
		utils.Host,
		utils.Username,
		utils.Password,
		utils.DBName,
		utils.Port)
		dialector = postgres.Open(dns)
	default:
		dialector = sqlite.Open("gorm.db")
	}

	db, err = gorm.Open(dialector, &gorm.Config{})
	if err != nil {
		log.Error("连接数据库失败，请检查连接参数：", err)
		os.Exit(1)
	}

	// 数据表结构迁移
	_ = db.AutoMigrate(User{})

	sqlDB, _ := db.DB()
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)
}

func GetDB() *gorm.DB {
	return db
}